package com.org.cloud.lg.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.org.cloud.lg.api.*;
import com.org.cloud.lg.dto.UserDto;
import com.org.cloud.lg.dto.UserRoleDto;
import com.org.cloud.lg.entity.UserEntity;
import com.org.cloud.lg.mapper.UserMapper;
import com.org.cloud.lg.utils.BaseContextKit;
import com.org.cloud.lg.utils.Checker;
import com.org.cloud.lg.utils.SnowflakeIdWorker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

@Service
public class UserServiceImpl extends MBaseServiceImpl<UserDto,UserEntity,UserMapper> implements UserService {

	@Autowired
	UserService userService;

	@Autowired
	UserRoleService userRoleService;

	@Autowired
	MenuService menuService;

	@Autowired
	RoleMenuService roleMenuService;

	@Override
	public UserDto findUserByUsername(String username) {
		Map<String,Object > param=new HashMap<>(16);
		param.put("username",username);
        return userService.getOneByMap(param);// 查询用户账户信息
	}

	@Override
	protected QueryWrapper<UserEntity> condition(UserEntity v) {
		return null;
	}


	@Override
	@Transactional
	public boolean save(UserDto userDto) {
		userDto.setId(generateId());
		if(super.insert(userDto)){
			insertUserRole(userDto.getRoleIds(),userDto.getId());
		}
		return true;
	}

	@Override
	public boolean deleteByUserId(String userId) {
		if(userId.equals(BaseContextKit.getUserID())){
			return true;
		}
		userRoleService.deleteByUserId(userId);
		return super.removeById(userId);
	}


	@Override
	public boolean update(UserDto userDto) {
		List<UserRoleDto> list=new ArrayList<UserRoleDto>();
		if( super.updateByPk(userDto)){
			//根据用户id先删除所有的角色然后再分配
			Map<String, Object> param=new HashMap<>();
			param.put("user_id", userDto.getId());
			userRoleService.removeByMap(param);
			insertUserRole(userDto.getRoleIds(),userDto.getId());
		}
		return true;
	}

	private boolean insertUserRole( String[] roleIds,String userId){
		List<UserRoleDto> list=new ArrayList<UserRoleDto>();
		for(String roleId :roleIds){
			UserRoleDto userRole=new UserRoleDto();
			userRole.setRoleId(roleId).setUserId(userId).setId(SnowflakeIdWorker.getId());
			list.add(userRole);
		}
		boolean res= userRoleService.insertUserRoleBatch(list);
		return res;
	}

	@Override
	public boolean deleteByIds(List<String> ids) {
		if(ids==null||ids.isEmpty()){
			return false;
		}
		for(String userId:ids){
			userRoleService.deleteByUserId(userId);
		}
		return super.deleteByPks(ids);
	}

	private boolean updateByIds(List<String> ids,Integer type) {
		if(ids==null||ids.isEmpty()){
			return true;
		}
		List<UserEntity> users=(List)listByIds(ids);
		if(Checker.BeNotEmpty(users)){
			users.forEach(userEntity -> {
				userEntity.setStatus(type);
			});
			return updateBatchById(users);
		}
		return true;
	}

	@Override
	public UserDto info(String userId) {
		UserDto userDto=getByPk(userId);
		Set<String> perms= menuService.selectPermsByUid(userId);
		userDto.setPerms(perms);
		return userDto;
	}

	@Override
	public UserDto getById(String id) {
		UserDto userDto=getByPk(id);
		List<String> list=userRoleService.selectRoleIdByUId(userDto.getId());
		if(Checker.BeNotEmpty(list))
		userDto.setRoleIds(list.toArray(new String[list.size()]));
		return userDto;
	}

	@Override
	public boolean batch(Integer type, List<String> ids) {
		if(type==-1){
			return  deleteByIds(ids);
		}else{
			return updateByIds(ids,type);
		}
	}
//
//	@Override
//	public UserEntity selectDetailById(Long userId) {
//		UserEntity user=getById(userId);
//		List<Long> roleIds=userRoleService.selectRoleIdByUId(userId);
//		Long[] roleArr = new Long[roleIds.size()];
//		user.setRoleIds(roleIds.toArray(roleArr));
//		return user;
//	}
//
//	@Override
//	public R updateMyPass(PassWordDto passWordDto) {
//		UserEntity userEntity=getById(passWordDto.getUserId());
//		if(userEntity!=null){
//			String old="";//MD5Utils.encrypt(userEntity.getUsername(), passWordDto.getOldPass());
//			if(old.equals(userEntity.getPassword())){
//				if(passWordDto.getNewPass().equals(passWordDto.getNewPassTwo())){
//					String newP="";//MD5Utils.encrypt(userEntity.getUsername(), passWordDto.getNewPass());
//					if(newP.equals(old)){
//						return R.error("新密码和旧密码一致,请确认");
//					}else{
//						userEntity.setPassword(newP);
//						if(updateById(userEntity)){
//							return R.ok("更新成功!");
//						}else{
//							return R.error("更新失败，请联系管理员");
//						}
//					}
//
//				}else{//不一致
//					return R.error("2次新密码不一致，请确认");
//				}
//			}else{
//				return R.error("旧密码不正确,请确认");
//			}
//		}else{
//			return R.error("用户不存在");
//		}
//	}
//
//	@Override
//	public String selectRoleName(Long userId) {
//		return userRoleDao.selectRoleName(userId);
//	}
//
//	@Override
//	public List<UserEntity> selectUserByDeptId(Long deptId) {
//		Map<String, Object> param=new HashMap<>();
//		param.put("dept_id", deptId);
//		return (List<UserEntity>) listByMap(param);
//	}
//
//	@Override
//	public List<String> selectRoleSign(Long userId) {
//		return userRoleDao.selectRoleSign(userId);
//	}
//
//	@Override
//	public R updateUserPass(Long userId) {
//		UserEntity user=getById(userId);
//		if(user!=null) {
//			String newp="";//MD5Utils.encrypt(user.getUsername(),Constant.newpass);
//			user.setPassword(newp);
//			if(updateById(user)) {
//				RedisTemplateUtil.del(Constant.loginTimes+user.getUsername());
//				return R.ok("修改成功! 新的密码为："+Constant.newpass);
//			}else {
//				return R.error("修改用户密码失败!");
//			}
//		}else {
//			return R.error("修改用户密码失败!");
//		}
//	}
//
//	@Override
//	public void buildEmailLink(UserEntity user, HttpServletRequest request) {
//		//生成密钥
//		String secretKey=UUID.randomUUID().toString();
//		//设置过期时间
//		Date outDate = new Date(System.currentTimeMillis() + 30 * 60 * 1000);// 30分钟后过期
//		long date = outDate.getTime() / 1000 * 1000;// 忽略毫秒数  mySql 取出时间是忽略毫秒数的
//		//此处应该更新user表中的过期时间、密钥信息
//		user.setOutDate(date);
//		user.setSecretKey(secretKey);
//		this.updateById(user);
//		//将用户名、过期时间、密钥生成链接密钥
//		String key =user.getEmail() + "$" + date + "$" + secretKey;
//		String digitalSignature = "";//MD5Utils.encrypt(key);// 数字签名
//		String path=request.getContextPath();
//		int port=request.getServerPort();
//		String basePath=request.getScheme()+"://"+request.getServerName()+":"+port+path;
//		if(port==80)
//			basePath=request.getScheme()+"://"+request.getServerName()+path;
//		String resetPassHref = basePath+"/email/toResetPass?sid="+digitalSignature+"&mail="+user.getEmail();
//		sendMail(user,resetPassHref);
//
//	}
//
//	private void sendMail(UserEntity user,String url){
//		Map<String, Object> map=new HashMap<>();
//		map.put("url", url);
//		String[] mails=new String[]{user.getEmail()};
//		MailData mail=new MailData();
//		mail.setPropertyMap(map);
//		mail.setUserIdCreate(user.getUserId());
//		mail.setTo(mails);
//		mail.setTplId("1");
//		messageService.sendAsynMail(mail);
//	}
//
//	@Override
//	public Map<String, Object> checkEmailLink(Map<String, String> map) {
//		Map<String, Object> res=new HashMap<>();
//		res.put("valid", false);
//		res.put("user", new UserEntity());
//		String sid=map.get("sid");
//		String mail=map.get("mail");
//		//获取链接中的用户名
//		if(StringUtils.isBlank(sid)||StringUtils.isBlank(mail)){
//			res.put("msg", "请求的链接不正确,请重新操作.");
//			return res;
//		}
//		UserEntity user= selectByEmail(mail);
//		if(user!=null){
//			//获取当前用户申请找回密码的过期时间
//			//找回密码链接已经过期
//			if(user.getOutDate()==null) {
//				res.put("msg", "该链接不正确,请确认是否是最新链接!");
//				return res;
//			}
//			if(user.getOutDate()<=System.currentTimeMillis()){
//				if(user.getOutDate().longValue()==-1){
//					res.put("msg", "该链接已被验证,请重新发送!");
//				}else{
//					res.put("msg", "链接已经过期请重新发送!");
//				}
//				return res;
//			}
//			//获取当前登陆人的加密码
//			String key = user.getEmail()+"$"+user.getOutDate()/1000*1000+"$"+user.getSecretKey();//数字签名
//			String digitalSignature ="";// MD5Utils.encrypt(key);// 数字签名
//			if(!digitalSignature.equals(sid)){
//				res.put("msg", "该链接不正确,请确认是否是最新链接!");
//				return res;
//			}else{
//				res.put("valid", true);
//				res.put("user", user);
//				return res;
//			}
//		}else{
//			res.put("msg", "用户信息不存在.");
//			return res;
//		}
//	}
//
//	@Override
//	public UserEntity selectByEmail(String email) {
//		QueryWrapper<UserEntity> wrapper = new QueryWrapper<UserEntity>();
//		wrapper.eq("email", email);
//		UserEntity user= this.getOne(wrapper);
//		return user;
//	}
//

}
